---
title: clsProviderLocation
summary: API reference for clsProviderLocation.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-08-21
library: SAIF.Business.View.Provider
reference_type: embedded
---

# clsProviderLocation

`clsProviderLocation` is the second aggregate root in this library, representing a single firm or person site tied back to its owning `clsProvider`. It implements `iPayee` alongside `clsProvider`, and exposes ten-plus lazily-loaded navigation properties (addresses, relationships, ineligibility periods, provider type, DCBS cost charges, MCO enrollments, services, service contracts) — each of which issues its own database query the first time it is read, producing a per-property N+1 access pattern when a caller walks the full graph.*

## Purpose
- Serves as the primary lookup target for legal/claim consumers resolving a payee's business location (used directly by `LegalManagerBase`, `clsCaseCostManager`, and `clsCaseCost` in consuming projects).
- Enforces structural integrity via rule checks that the location ID, owning provider ID, and provider type code all resolve to real, non-zero/non-empty values ([BR-PLOC-001](../../business-rules.md#br-ploc-001-provider-location-id-must-be-positive), [BR-PLOC-002](../../business-rules.md#br-ploc-002-provider-id-must-be-positive), [BR-PLOC-003](../../business-rules.md#br-ploc-003-provider-type-code-must-be-non-empty)).
- Determines whether a location is ineligible on a given date by checking all its ineligibility windows ([BR-PLOC-004](../../business-rules.md#br-ploc-004-ineligible-locations-are-excluded-from-filtered-lists)).
- Reports payee type as the constant `"PROV"` classification, mirroring `clsProvider`'s behavior ([BR-PRV-005](../../business-rules.md#br-prv-005-payee-type-is-always-provider)).
- Computes its dirty state as a composite of its own field state and its embedded name object's dirty state ([BR-PLOC-005](../../business-rules.md#br-ploc-005-provider-location-dirty-state-is-composite)).

## Context
- Namespace: `SAIF.Business.View.Provider`
- Assembly/package: `SAIF.Business.View.Provider` (embedded/project-compiled); also distributed as the NuGet package `SAIF.BOF.Business.View.Provider`.

## Public members
| Member | Signature | Purpose |
| --- | --- | --- |
| `GetProviderLocation` | `Shared Function GetProviderLocation(dpi As IDataPortalInfo, providerLocationID As Decimal) As clsProviderLocation` | Retrieves a single location by ID, mapping ~27 columns including flags, name, and phone (OP-02). |
| `ProviderLocationID` | `ReadOnly Property ProviderLocationID As Decimal` | Primary key of the location row; must be greater than zero on a valid load ([BR-PLOC-001](../../business-rules.md#br-ploc-001-provider-location-id-must-be-positive)). |
| `ProviderID` | `ReadOnly Property ProviderID As Decimal` | Owning provider's key; must resolve to a value greater than zero ([BR-PLOC-002](../../business-rules.md#br-ploc-002-provider-id-must-be-positive)). |
| `ProviderTypeCode` | `ReadOnly Property ProviderTypeCode As String` | Code of the provider type governing this location's behavior; must be non-empty ([BR-PLOC-003](../../business-rules.md#br-ploc-003-provider-type-code-must-be-non-empty)). |
| `Addresses` | `ReadOnly Property Addresses As clsProviderAddressCollection` | Lazily loads all addresses for this location on first access (OP-04). |
| `ActiveAddresses` | `ReadOnly Property ActiveAddresses As clsProviderAddressCollection` | Lazily loads and filters addresses to those active as of today ([BR-PADR-002](../../business-rules.md#br-padr-002-address-active-on-date-determination)). |
| `ChildRelationships` | `ReadOnly Property ChildRelationships As clsProviderRelationshipCollection` | Lazily loads relationships where this location is the parent (OP-05). |
| `ParentRelationships` | `ReadOnly Property ParentRelationships As clsProviderRelationshipCollection` | Lazily loads relationships where this location is the child (OP-05). |
| `IneligibilityPeriods` | `ReadOnly Property IneligibilityPeriods As clsProviderIneligibilityPeriodCollection` | Re-queries `PROVIDER_INELIG_PERIOD` on every access (not cached) to return this location's ineligibility windows (OP-06). |
| `Provider` | `ReadOnly Property Provider As clsProvider` | Lazily loads the owning `clsProvider` (OP-01), forming a reciprocal navigation cycle with `clsProvider.ProviderLocations`.* |
| `ProviderType` | `ReadOnly Property ProviderType As clsProviderType` | Lazily loads the `clsProviderType` referenced by `ProviderTypeCode` (OP-07). |
| `DCBSCostCharges` | `ReadOnly Property DCBSCostCharges As clsDCBSCostChargeList` | Lazily loads DCBS cost-to-charge factors for this location (OP-10). |
| `MCOList` | `ReadOnly Property MCOList As clsMCOProviderList` | Lazily loads MCO enrollments for this location (OP-11). |
| `Services` | `ReadOnly Property Services As clsProviderServiceList` | Lazily loads service code assignments for this location (OP-12). |
| `ServiceContracts` | `ReadOnly Property ServiceContracts As clsProviderServiceContractList` | Lazily loads service contracts for this location, windowed by the default 721-day offset ([BR-PSVC-001](../../business-rules.md#br-psvc-001-service-contracts-are-limited-to-the-offset-window)) (OP-12). |
| `IsDuringIneligibilityPeriod` | `Function IsDuringIneligibilityPeriod(asOfDate As Date) As Boolean` | Returns true when the given date falls inside any of this location's ineligibility windows ([BR-PLOC-004](../../business-rules.md#br-ploc-004-ineligible-locations-are-excluded-from-filtered-lists)). |
| `IsApproved` | `ReadOnly Property IsApproved As Boolean` | Converts the `APPROVED_FLAG` Y/N column to a Boolean indicating provider approval status. |
| `IsBusiness` | `ReadOnly Property IsBusiness As Boolean` | Converts the business/person Y/N flag; true when the location represents a business rather than an individual. |
| `IsCriticalAccessHospital` | `ReadOnly Property IsCriticalAccessHospital As Boolean` | Converts the CAH Y/N flag identifying critical access hospital status. |
| `IsIneligible` | `ReadOnly Property IsIneligible As Boolean` | Converts the ineligible Y/N flag stored directly on the location row (distinct from date-windowed `IsDuringIneligibilityPeriod`). |
| `IsPossibleFraud` | `ReadOnly Property IsPossibleFraud As Boolean` | Converts the possible-fraud Y/N flag used to surface a fraud-risk indicator to callers. |
| `IsPrimaryLocation` | `ReadOnly Property IsPrimaryLocation As Boolean` | Converts the primary-location Y/N flag consumed by `clsProvider.PrimaryLocation` selection ([BR-PRV-006](../../business-rules.md#br-prv-006-primary-location-selection)). |
| `HasRecentActivity` | `ReadOnly Property HasRecentActivity As Boolean` | Converts a Y/N flag indicating whether the location has had recent claim/legal activity. |
| `PayeeType` / `PayeeTypeCode` | `ReadOnly Property` (via `iPayee`) | Always resolve to the "Provider"/`"PROV"` payee classification ([BR-PRV-005](../../business-rules.md#br-prv-005-payee-type-is-always-provider)). |
| `PayeeAddress`, `PayeeID`, `PayeePhoneNumber`, `PayeeEmailAddress` | `ReadOnly Property` (via `iPayee`) | Location-level payee identity surfaced for payment-related consumers (mirrors `clsProvider`'s `iPayee` implementation).* |
| `IsValid` | `ReadOnly Property IsValid As Boolean` (overridden from `clsBusinessBase`) | Reflects the combined result of [BR-PLOC-001](../../business-rules.md#br-ploc-001-provider-location-id-must-be-positive), [BR-PLOC-002](../../business-rules.md#br-ploc-002-provider-id-must-be-positive), and [BR-PLOC-003](../../business-rules.md#br-ploc-003-provider-type-code-must-be-non-empty). |
| `IsDirty` | `ReadOnly Property IsDirty As Boolean` (overridden from `clsBusinessBase`) | True when the location's own state or its embedded name object is dirty ([BR-PLOC-005](../../business-rules.md#br-ploc-005-provider-location-dirty-state-is-composite)). |
| `Save` | `Function Save() As clsProviderLocation` (overridden from `clsBusinessBase`) | Calls `ApplyEdit()`/`MyBase.Save()` but cannot persist changes since no write SQL exists ([BR-DATA-001](../../business-rules.md#br-data-001-no-write-operations-are-supported)).* |

## Behavioral notes
- OP-02 populates ~27 columns on load, mapping flag columns via `.ToBoolean`, name parts into an embedded `clsName`, and phone parts concatenated into a `clsPhone`.
- None of the navigation properties are cached across accesses; `IneligibilityPeriods` explicitly re-queries the database every time it is read.
- `Rule_ValidProviderLocation` (Level I), `Rule_ValidProvider` and `Rule_ValidProviderTypeCode` (Level III) are registered at construction and drive `IsValid`.

## Constraints and usage notes
- Every navigation property access is a separate round trip; callers walking the whole location graph should expect multiple queries rather than a single join.*
- The type cannot persist edits; `Save()` is present only for interface compatibility with the BOF write pattern ([BR-DATA-001](../../business-rules.md#br-data-001-no-write-operations-are-supported)).

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts. Statements marked with `**` could not be confirmed; treat
> as unknown until verified.

## Sources
- SAIF.Business.View.Provider/clsProviderLocation.vb
